package com.ruoyi.waterManagement.util;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * Create by hwd
 */
public class BigDecimalUtil {
    public static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.00");


    //加法
    public static BigDecimal add(BigDecimal num1, BigDecimal num2) {
        return num1.add(num2);
    }

    //减法
    public static BigDecimal subtract(BigDecimal num1, BigDecimal num2) {
        return num1.subtract(num2);
    }

    //乘法
    public static BigDecimal multiply(BigDecimal num1, BigDecimal num2) {
        return num1.multiply(num2);
    }

    //除法
    public static BigDecimal divide(BigDecimal num1, BigDecimal num2) {
        return num1.divide(num2, 4, BigDecimal.ROUND_HALF_UP);
    }

    public static BigDecimal add(String str1, String str2) {
        return add(new BigDecimal(str1), new BigDecimal(str2));
    }

    public static BigDecimal add(Double d1, Double d2) {
        return add(d1.toString(), d2.toString());
    }

    public static BigDecimal add(Long lg1, Long lg2) {
        return add(lg1.toString(), lg2.toString());
    }

    public static BigDecimal subtract(String str1, String str2) {
        return subtract(new BigDecimal(str1), new BigDecimal(str2));
    }

    public static BigDecimal subtract(Double d1, Double d2) {
        return subtract(d1.toString(), d2.toString());
    }

    public static BigDecimal subtract(Long lg1, Long lg2) {
        return subtract(lg1.toString(), lg2.toString());
    }

    public static BigDecimal multiply(String str1, String str2) {
        return multiply(new BigDecimal(str1), new BigDecimal(str2));
    }

    public static BigDecimal multiply(Double d1, Double d2) {
        return multiply(d1.toString(), d2.toString());
    }

    public static BigDecimal multiply(Long lg1, Long lg2) {
        return multiply(lg1.toString(), lg2.toString());
    }

    public static BigDecimal divide(String str1, String str2) {
        return divide(new BigDecimal(str1), new BigDecimal(str2));
    }

    public static BigDecimal divide(Double d1, Double d2) {
        return divide(d1.toString(), d2.toString());
    }

    public static BigDecimal divide(Long lg1, Long lg2) {
        return divide(lg1.toString(), lg2.toString());
    }

    /**
     * 判断是否是0
     * true: 为0
     * false: 不为0
     *
     * @param num1
     * @return
     */
    public static boolean checkIsNumZero(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("0")) == 0);
    }

    /**
     * 判断是否大于0
     */
    public static boolean checkGreaterThanZero(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("0")) > 0);
    }

    /**
     * 判断是否小于0
     */
    public static boolean checkLessThanZero(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("0")) < 0);
    }

    /**
     * 判断是否大于等于0
     */
    public static boolean checkGreaterThanOrEqualToZero(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("0")) >= 0);
    }

    /**
     * 判断是否小于等于0
     */
    public static boolean checkLessThanOrEqualToZero(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("0")) <= 0);
    }

    /**
     * 判断是否是-1
     * true: 为-1
     * false: 不为-1
     *
     * @param num1
     * @return
     */
    public static boolean checkIsNumNvgOne(BigDecimal num1) {
        return (num1.compareTo(new BigDecimal("-1")) == 0);
    }

    public static BigDecimal convertToBigDecimal(String num1) {
        return new BigDecimal(num1);
    }

    public static BigDecimal convertToBigDecimal(Long num1) {
        return convertToBigDecimal(num1.toString());
    }

    public static BigDecimal convertToBigDecimal(Integer num1) {
        return convertToBigDecimal(num1.toString());
    }

    public static BigDecimal convertToBigDecimal(Double num1) {
        return convertToBigDecimal(num1.toString());
    }

    /**
     * 检查 num1是否比num2小
     *
     * @param num1
     * @param num2
     * @return
     */
    public static boolean checkNum1LessThenNum2(BigDecimal num1, BigDecimal num2) {
        return (num1.compareTo(num2) < 0);
    }

    /**
     * 检查 num1是否小于等于num2
     *
     * @param num1
     * @param num2
     * @return
     */
    public static boolean checkNum1LessThenOrEqualToNum2(BigDecimal num1, BigDecimal num2) {
        return (num1.compareTo(num2) <= 0);
    }

    /**
     * 检查 num1是否比num2大
     *
     * @param num1
     * @param num2
     * @return
     */
    public static boolean checkNum1GreaterThenNum2(BigDecimal num1, BigDecimal num2) {
        return (num1.compareTo(num2) > 0);
    }


    /**
     * 检查 num1是否大于等于num2
     *
     * @param num1
     * @param num2
     * @return
     */
    public static boolean checkNum1GreaterThenOrEqualToNum2(BigDecimal num1, BigDecimal num2) {
        return (num1.compareTo(num2) >= 0);
    }


    public static BigDecimal k(BigDecimal  y1, BigDecimal y2, BigDecimal x1,BigDecimal x2){
        BigDecimal s = BigDecimalUtil.subtract(y2,y1);//y2-y1
        BigDecimal s1=BigDecimalUtil.subtract(x2,x1);//x2-x1
        BigDecimal s2 =BigDecimalUtil.divide(s,s1);
        return s2;
    }
    //(y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);
    public static BigDecimal b(BigDecimal  y1, BigDecimal y2, BigDecimal x1,BigDecimal x2){
        BigDecimal s1=BigDecimalUtil.subtract(x2,x1); //x2-x1
        BigDecimal s2=BigDecimalUtil.multiply(y1,s1);//y1*(x2-x1)
        BigDecimal s3 = BigDecimalUtil.subtract(y2,y1);//y2-y1
        BigDecimal s4=BigDecimalUtil.multiply(x1,s3);//x1*(y2 - y1)
        BigDecimal s5=BigDecimalUtil.subtract(s2,s4);//(y1*(x2 - x1) - x1*(y2 - y1))
        BigDecimal s6=BigDecimalUtil.divide(s5,s1);//(y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1)
        return s6;
    }
    //y=k1*x+k2*x²+k3*x3+k4*x4+k5*x5+b
    public static BigDecimal y(double k1,double k2,double k3,double k4,double k5,double b,double x){
        BigDecimal k1s=new BigDecimal(Double.toString(k1));
        BigDecimal k2s=new BigDecimal(Double.toString(k2));
        BigDecimal k3s=new BigDecimal(Double.toString(k3));
        BigDecimal k4s=new BigDecimal(Double.toString(k4));
        BigDecimal k5s=new BigDecimal(Double.toString(k5));
        BigDecimal xs=new BigDecimal(Double.toString(x));
        double kx=multiply(k1s,xs).doubleValue();
        BigDecimal k1x=multiply(k1s,xs);
        BigDecimal k2x=multiply(new BigDecimal(k2),multiply(x,x));
        BigDecimal k3x=multiply(new BigDecimal(k3),multiply(new BigDecimal(x),multiply(x,x)));
        BigDecimal k4x=multiply(new BigDecimal(k4),multiply(new BigDecimal(x),multiply(new BigDecimal(x),multiply(x,x))));
        BigDecimal k5x=multiply(new BigDecimal(k5),multiply(new BigDecimal(x),multiply(new BigDecimal(x),multiply(new BigDecimal(x),multiply(x,x)))));
        //保留三位小数(四舍五入)
        BigDecimal y=add(k1x,add(k2x,add(add(add(k5x,new BigDecimal(b)),k4x),k3x))).setScale(3,BigDecimal.ROUND_HALF_UP);;
        return y;
    }

    public static void main(String[] args) {
        BigDecimal k1s=new BigDecimal(Double.toString(0));
        BigDecimal k2s=new BigDecimal(Double.toString(-0.13546485484));
        double kx=multiply(k1s,k2s).doubleValue();
        System.out.println(kx);
    }
}
